﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Logica;
using ComunesMGI.Constantes;
using ComunesMGI.Mensajes;


namespace ClienteWinMGI.Presentacion
{
    public partial class AltaWorkPackage : Form
    {
        private List<DataCliente> _clientes;
        private List<DataSistema> _sistemas;

        public AltaWorkPackage()
        {
            
            InitializeComponent();
            clearValidator();
            cargarClientes();
            dateTPFechaIni.MinDate = DateTime.Today;
            dateTPFechaEstEntrega.MinDate = DateTime.Today;

            // Ejemplo de como usar el datepickeropcional
            // para borrar la fecha, pararse en el control y tocar backspace o del (supr)

            // texto cuando el valor es nulo
            dateTPFechaEstEntrega.NullValue = "Seleccione si desea una fecha";
            dateTPFechaIni.NullValue = "Seleccione si desea una fecha";

            // setear una fecha
           // dateTPFechaEstEntrega.Value = new DateTime(2008, 10, 2);

            //no setear nada 
            dateTPFechaEstEntrega.Value = null;
            dateTPFechaIni.Value = null;


        
        }

        private void clearValidator()
        {
            imgValidator.Visible = false;
            lblValidator.Visible = false;
        }

        private void showValidator(string textoValidator)
        {
            imgValidator.Visible = true;
            lblValidator.Visible = true;
            lblValidator.Text = textoValidator;
        }

        private void grBoxExtras_Enter(object sender, EventArgs e)
        {

        }


        private void cargarClientes()
        {

            try
            {
                IClientes iClientes = LogicaFactory.getInstance().getIClientes();
                List<DataCliente> ldc = iClientes.getClientes();
                if (ldc.Count > 0)
                {
                    cboCliente.Items.Clear();
                    foreach (DataCliente dc in ldc)
                    {
                        cboCliente.Items.Add(dc.Nombre);
                    }
                    _clientes = ldc;
                }
                else
                {
                    showValidator("No existen clientes ingresados en el sistema");
                }

            }
            catch (Exception ex)
            {
                showValidator(ex.Message);

            }

        }
        private void btnIngresar_Click(object sender, EventArgs e)
        {
            if (cboCliente.SelectedIndex == -1)
            {
                showValidator("Debe ingresar un cliente");
            }
            else
            {
                if (cboSistema.SelectedIndex == -1)
                {
                    showValidator("Debe ingresar un sistema");
                }
                else
                {
                    if (txtNombre.Text == "")
                    {
                        showValidator("Debe ingresar el nombre del Work Package");
                    }
                    else
                    {
                        try
                        {

                            clearValidator();
                            //En este caso es que voy a llamar a la funcion addWorkPackage
                            LogicaFactory lf = LogicaFactory.getInstance();
                            IIncidentes ii = lf.getIIncidentes();
                            DataSistema actualDs = _sistemas.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());
                            DataCliente actualDc = _clientes.First(ds => ds.Nombre == cboCliente.SelectedItem.ToString());
                            int idWPCreado;
                            //pregunto si los dos datetimepicker opcionales son distintos de null
                            if (dateTPFechaEstEntrega.Value != null && dateTPFechaIni.Value!=null)
                            {
                                // casteo el value a fecha
                                DataWP datosWorkPackage = new DataWP(txtNombre.Text, (DateTime)dateTPFechaIni.Value, (DateTime)dateTPFechaEstEntrega.Value);
                                idWPCreado=ii.addWorkPackage(actualDs.Codigo, datosWorkPackage);
                            }
                            else
                            {
                                if (dateTPFechaEstEntrega.Value != null)
                                {
                                    DateTime tNulaIni = ConstantesMGI.FechaVacia;
                                    DataWP datosWorkPackage = new DataWP(txtNombre.Text, tNulaIni, (DateTime)dateTPFechaEstEntrega.Value);
                                    idWPCreado = ii.addWorkPackage(actualDs.Codigo, datosWorkPackage);
                                }
                                else
                                {
                                    if (dateTPFechaIni.Value!=null)
                                    {
                                        DateTime tNulaFin = ConstantesMGI.FechaVacia;
                                        DataWP datosWorkPackage = new DataWP(txtNombre.Text, (DateTime)dateTPFechaIni.Value, tNulaFin);

                                        idWPCreado = ii.addWorkPackage(actualDs.Codigo, datosWorkPackage);
                                    }
                                    else
                                    {
                                        DateTime tNula= ConstantesMGI.FechaVacia;
                                        DataWP datosWorkPackage = new DataWP(txtNombre.Text,tNula, tNula);
                                        idWPCreado = ii.addWorkPackage(actualDs.Codigo, datosWorkPackage);
                                    }
                                }
                            }
                            Notificacion notificacion = new Notificacion("Ingreso exitoso", "Alta de Work Package exitosa", "Se ha dado de alta el Work Package con nombre " + txtNombre.Text + " y identificador " + idWPCreado.ToString());
                            notificacion.ShowDialog();


                        }
                        catch (Exception ex)
                        {
                            Error err = new Error("Error", "", ex.Message);
                            err.ShowDialog();
                        }
                    }

                }
            }
        }


        private void cboCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (cboCliente.SelectedIndex != -1)
                {
                    //vacio el combo de los sistemas
                    cboSistema.Items.Clear();

                    //limpio el validador
                    clearValidator();
                    txtNombre.Text = "";

                    cargarSistemas(_clientes.First(dc => dc.Nombre == cboCliente.SelectedItem.ToString()));
                    dateTPFechaEstEntrega.Enabled = false;
                    dateTPFechaIni.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                Error error = new Error("Error", "Error al cargar los sistemas", ex.Message);
                error.ShowDialog();
                cboCliente.SelectedIndex = -1;
            }
        }

        private void cargarSistemas(DataCliente cliente)
        {
            List<DataSistema> lds;
            ISistemas il = LogicaFactory.getInstance().getISistemas();
            lds = il.getSistemas(cliente.Codigo);
            if (lds.Count > 0)
            {
                foreach (DataSistema ds in lds)
                {
                    cboSistema.Items.Add(ds.Nombre);
                }
                _sistemas = lds;
                cboSistema.Enabled = true;
                txtNombre.Enabled = false;


            }
            else 
            
            {
                _sistemas = null;
                showValidator("No hay sistemas para el cliente seleccionado");
            }
        }


        private void cboSistema_SelectedIndexChanged(object sender, EventArgs e)
        {
            
            if (cboSistema.SelectedIndex != -1)
            {
                clearValidator();
                txtNombre.Clear();
                txtNombre.Enabled = true;
                dateTPFechaEstEntrega.Enabled = true;
                dateTPFechaIni.Enabled = true;
            }
           
          
        }

        private void tableLayoutPanel4_Paint(object sender, PaintEventArgs e)
        {

        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void lblNombre_Click(object sender, EventArgs e)
        {

        }

        private void txtNombre_TextChanged(object sender, EventArgs e)
        {
            clearValidator();
        }

        private void rbtnFechaInicio_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void rbtnFF_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void chkIni_CheckedChanged(object sender, EventArgs e)
        {

        }
    }
}
